
// Autor: Lynn Liebert (u.a.)
// Diese Klasse enthaelt die Aktionen/Events, die im Menu des Spiels aufgerufen werden.
// Dazu gehoert: 
// - Erstellung von Spielern/KI und das Starten eines neuen Spiels 
// - Die Speicher- und Ladefunktion ist noch nicht komplett fertiggestellt
// - Hovereffekte der Hauptmenulabels
// - Navigation durch die einzelnen Menubausteine

package events;

import interfaces.ICalculate;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JLabel;

import logic.SaveGame;
import logic.SaveLoadHelper;

import view.GameWindow;
import view.Startmenu;


public class MenuAction implements KeyListener ,MouseListener, MouseMotionListener, ActionListener{

	private ICalculate logic;
	
	private Startmenu menu;
	/**
	 * Konstruktor fuer den Menu-Event-Kontainer
	 */
	public MenuAction(ICalculate logic)
	{
		this.logic = logic; // logic hinzufuegen
	}

	public void setStartmenu(Startmenu menu)
	{
		this.menu = menu;
	}
	
	
	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
		if(e.getKeyCode() == KeyEvent.VK_ESCAPE && e.getComponent().getClass() == GameWindow.class)
		{
			((GameWindow)e.getComponent()).toggleMenu();
			//System.exit(0);			
		}
		else if(e.getKeyCode() == KeyEvent.VK_ENTER && e.getComponent().getClass() == GameWindow.class)
		{
			
		}
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub
		
	}
	
	@Override
	public void mouseDragged(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseMoved(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		if(e.getComponent().getClass() == JLabel.class)			
		{	
			if(((javax.swing.JLabel)(e.getComponent())).getText()==" Neues Spiel")
			// Wenn geklicktes Label " Neues Spiel" ist
			{
				// Buttons (Neues Spiel, usw.) ausblenden
				this.menu.nSpiel.setVisible(false);
				this.menu.sSpiel.setVisible(false);
				this.menu.lSpiel.setVisible(false);
				this.menu.bSpiel.setVisible(false);
				
				// Panel zur Namenseingabe einblenden
				this.menu.nSpielPanTxt.setVisible(true);
				
				// Labels "Spieler x" einblenden
				this.menu.name1lab.setVisible(true);
				this.menu.name2lab.setVisible(true);
				this.menu.name3lab.setVisible(true);
				this.menu.name4lab.setVisible(true);
				
				// Textfelder zur Namenseingabe einblenden
				this.menu.name1txt.setVisible(true);
				this.menu.name2txt.setVisible(true);
				this.menu.name3txt.setVisible(true);
				this.menu.name4txt.setVisible(true);
				
				// Farbfelder einblenden
				this.menu.lab_blue.setVisible(true);
				this.menu.lab_red.setVisible(true);
				this.menu.lab_yellow.setVisible(true);
				this.menu.lab_green.setVisible(true);
				
				// Checkboxen zur KI-Abfrage einblenden
				this.menu.KIcheck1.setVisible(true);
				this.menu.KIcheck2.setVisible(true);
				this.menu.KIcheck3.setVisible(true);
				this.menu.KIcheck4.setVisible(true);
				
				// Label "KI"
				this.menu.ki.setVisible(true);
				
				// Buttons zum Bestaetigen und "Zurueck" einblenden
				this.menu.spielerBestaet.setVisible(true);
				this.menu.back.setVisible(true);
				
				
			
				
				
				
			}
			// Wenn " Spiel beenden" geklickt wird: Programmende.
			else if(((javax.swing.JLabel)(e.getComponent())).getText()==" Spiel beenden")
			{
				System.exit(0);
			}
			
			else if(((javax.swing.JLabel)(e.getComponent())).getText()==" Spiel speichern")
			// Wenn " Spiel speichern" geklickt wird: Aktuelles Spiel wird gespeichert
			{
				String SaveGameName="";
				SaveGame save = new SaveGame(SaveGameName);
				SaveLoadHelper slhelp = new SaveLoadHelper(save);
				slhelp.save();
				this.menu.lSave.setVisible(true);
				
				
				// *************************************************
				// Diese Klasse/dieser Task wird durch den Timer aufgerufen, "Saved." entfernen
				
				class lSaveInvisible extends TimerTask{
					public void run()
          {  				
					// Blende lSave aus
					MenuAction.this.menu.lSave.setVisible(false);  	
					}
				}
				//*************************************************************************
				//----Timer, schliesst nach 5 Sekunden das Fenster----
				Timer timer = new Timer();
				timer.schedule(new lSaveInvisible(), 3000);
				//*************************************************************************
				
				
				
			}
			else if(((javax.swing.JLabel)(e.getComponent())).getText()==" Spiel laden")
			{
				//SaveLoadHelper slhelp = new SaveLoadHelper();
				
				this.menu.LoadGamePan.setVisible(true);
				
				// Buttons (Neues Spiel, usw.) ausblenden
				this.menu.nSpiel.setVisible(false);
				this.menu.sSpiel.setVisible(false);
				this.menu.lSpiel.setVisible(false);
				this.menu.bSpiel.setVisible(false);
				
				//this.menu.LoadList.set
				
			}
		}
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		
		if(e.getComponent().getClass() == JLabel.class)			
		{	
			// Hovereffekt der Labels im Hauptmenu: Maus auf Label? Ja->Grau unterlegt.
			if(((javax.swing.JLabel)(e.getComponent())).getText()==" Neues Spiel")
			{
				this.menu.nSpiel.setBackground(Color.gray);
				this.menu.nSpiel.setOpaque(true);
			}
			
			else if(((javax.swing.JLabel)(e.getComponent())).getText()==" Spiel speichern")
			{
				this.menu.sSpiel.setBackground(Color.gray);
				this.menu.sSpiel.setOpaque(true);
			}
			
			else if(((javax.swing.JLabel)(e.getComponent())).getText()==" Spiel laden")
			{
				this.menu.lSpiel.setBackground(Color.gray);
				this.menu.lSpiel.setOpaque(true);
			}
			
			else if(((javax.swing.JLabel)(e.getComponent())).getText()==" Spiel beenden")
			{
				this.menu.bSpiel.setBackground(Color.gray);
				this.menu.bSpiel.setOpaque(true);
			}
		}
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		
		if(e.getComponent().getClass() == JLabel.class)			
		{	
			// Hovereffekt der Labels im Hauptmenu: Maus verlaesst Label? Ja->Grau entfernen.
			if(((javax.swing.JLabel)(e.getComponent())).getText()==" Neues Spiel")
			{
				this.menu.nSpiel.setBackground(Color.white);
				this.menu.nSpiel.setOpaque(false);
			}
			
			else if(((javax.swing.JLabel)(e.getComponent())).getText()==" Spiel speichern")
			{
				this.menu.sSpiel.setBackground(Color.white);
				this.menu.sSpiel.setOpaque(false);
			}
			
			else if(((javax.swing.JLabel)(e.getComponent())).getText()==" Spiel laden")
			{
				this.menu.lSpiel.setBackground(Color.white);
				this.menu.lSpiel.setOpaque(false);
			}
			
			else if(((javax.swing.JLabel)(e.getComponent())).getText()==" Spiel beenden")
			{
				this.menu.bSpiel.setBackground(Color.white);
				this.menu.bSpiel.setOpaque(false);
			}
			
		}
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}


	
	@Override
	public void actionPerformed(ActionEvent e) {
		
		if( e.getSource().equals(this.menu.spielerBestaet)) // wenn Bestaetigungsbutton geklickt:
		{
			int p = 0; // Zaehlvariable Spieleranzahl, Spieler zaehlen:
			// Sowohl Spieler als auch KI wird gezaehlt
			if (! this.menu.name1txt.getText().equals("") || this.menu.KIcheck1.isSelected()==true)
				p += 1;
			if (! this.menu.name2txt.getText().equals("") || this.menu.KIcheck2.isSelected()==true)
				p += 1;
			if (! this.menu.name3txt.getText().equals("") || this.menu.KIcheck3.isSelected()==true)
				p += 1;
			if (! this.menu.name4txt.getText().equals("") || this.menu.KIcheck4.isSelected()==true)
				p += 1;
		// ************************************************	
		// Elemente des vorherigen Panels (nSpielPanTxt) unsichtbar machen
		// ************************************************
		if (p >= 2) // Wenn nicht mindestens 2 Spieler vorhanden, kein Spielstart!
		{
		this.menu.nSpielPanTxt.setVisible(false);	
		this.menu.nSpielPanNam.setVisible(true);
		
		this.menu.name1lab.setVisible(false);
		this.menu.name2lab.setVisible(false);
		this.menu.name3lab.setVisible(false);
		this.menu.name4lab.setVisible(false);
		
		this.menu.KIcheck1.setVisible(false);
		this.menu.KIcheck2.setVisible(false);
		this.menu.KIcheck3.setVisible(false);
		this.menu.KIcheck4.setVisible(false);
		
		this.menu.ki.setVisible(false);
		
		this.menu.morePlayer.setVisible(false);
		
		this.menu.spielerBestaet.setVisible(false);
		
		
		this.menu.remove(this.menu.lab_blue);
		this.menu.remove(this.menu.lab_red);
		this.menu.remove(this.menu.lab_yellow);
		this.menu.remove(this.menu.lab_green);
		
		this.menu.remove(this.menu.name1lab);
		this.menu.remove(this.menu.name2lab);
		this.menu.remove(this.menu.name3lab);
		this.menu.remove(this.menu.name4lab);
		
		// ************************************************
		// Elemente des naechsten Panels (nSpielPanNam) sichtbar machen
		// ************************************************	
		
		this.menu.spieler1lab.setVisible(true);
		this.menu.spieler2lab.setVisible(true);
		this.menu.spieler3lab.setVisible(true);
		this.menu.spieler4lab.setVisible(true);
		
		this.menu.name1lab.setVisible(true);
		this.menu.name2lab.setVisible(true);
		this.menu.name3lab.setVisible(true);
		this.menu.name4lab.setVisible(true);
		
		this.menu.nSpielPanNam.add(this.menu.lab_green);
		this.menu.nSpielPanNam.add(this.menu.lab_yellow);
		this.menu.nSpielPanNam.add(this.menu.lab_blue);
		this.menu.nSpielPanNam.add(this.menu.lab_red);
		
		this.menu.nSpielPanNam.add(this.menu.name1lab);
		this.menu.nSpielPanNam.add(this.menu.name2lab);
		this.menu.nSpielPanNam.add(this.menu.name3lab);
		this.menu.nSpielPanNam.add(this.menu.name4lab);
		
		// ************************************************
		// Spieler erzeugen, Namen Uebergeben, Namen anzeigen
		// ************************************************
		
		int i=1; // Zaehlvariable fuer KI
		
		// Wenn das Textfeld1 nicht leer ist, erzeuge Spieler1 mit Namen, Farbe und frage KI ab.
		if (! this.menu.name1txt.getText().equals("") && this.menu.KIcheck1.isSelected()==false)
		{
			logic.getBoard().addPlayer(this.menu.name1txt.getText(), "red", false);
			// Anzeige der Spielernamen durch Labels im naechsten Panel
			this.menu.spieler1lab.setText(this.menu.name1txt.getText());
		}
		else
			// Wenn die Checkbox ausgewaehlt ist, erstelle eine KI mit Namen "Computer" +i, wobei i eine fortlaufende Nummer ist
			if (this.menu.KIcheck1.isSelected()==true)
			// Checkbox ausgewaehlt? Ja->Erstelle KI
			{
				logic.getBoard().addPlayer("Computer" + i, "red", true);
				this.menu.spieler1lab.setText("Computer" +i);
				i += 1;
			}	
			
		
		// Wenn das Textfeld2 nicht leer ist, erzeuge Spieler2 mit Namen, Farbe und frage KI ab.
		if (! this.menu.name2txt.getText().equals("") && this.menu.KIcheck2.isSelected()==false)
		{
			logic.getBoard().addPlayer(this.menu.name2txt.getText(), "green", false);
			// Anzeige der Spielernamen durch Labels im naechsten Panel
			this.menu.spieler2lab.setText(this.menu.name2txt.getText());
		}
		else
			if (this.menu.KIcheck2.isSelected()==true)
			// Checkbox ausgewaehlt? Ja->Erstelle KI
			{
				logic.getBoard().addPlayer("Computer" + i, "green", true);
				this.menu.spieler2lab.setText("Computer" +i);
				i += 1;
			}
		
		
		
		// Wenn das Textfeld3 nicht leer ist, erzeuge Spieler3 mit Namen, Farbe und frage KI ab.
		if (! this.menu.name3txt.getText().equals("") && this.menu.KIcheck3.isSelected()==false)
		{	
			logic.getBoard().addPlayer(this.menu.name3txt.getText(), "yellow", false);
			// Anzeige der Spielernamen durch Labels im naechsten Panel
			this.menu.spieler3lab.setText(this.menu.name3txt.getText());
		}
		else
			if (this.menu.KIcheck3.isSelected()==true)
			// Checkbox ausgewaehlt? Ja->Erstelle KI
			{
				logic.getBoard().addPlayer("Computer" +i, "yellow", true);
				this.menu.spieler3lab.setText("Computer" +i);
				i += 1;
			}
		
		
		// Wenn das Textfeld4 nicht leer ist, erzeuge Spieler4 mit Namen, Farbe und frage KI ab.
		if (! this.menu.name4txt.getText().equals("") && this.menu.KIcheck4.isSelected()==false)
		{	
			logic.getBoard().addPlayer(this.menu.name4txt.getText(), "blue", false);
			// Anzeige der Spielernamen durch Labels im naechsten Panel
			this.menu.spieler4lab.setText(this.menu.name4txt.getText());
		}
		else
			if (this.menu.KIcheck4.isSelected()==true)
			// Checkbox ausgewaehlt? Ja->Erstelle KI
			{	
				logic.getBoard().addPlayer("Computer" +i, "blue", true);
				this.menu.spieler4lab.setText("Computer" +i);
				i += 1;
			}
		
		
				
		
				
		// ***************************************************************************************
		// Diese Klasse/dieser Task wird durch den Timer aufgerufen, START des eigentlichen Spiels
		
		class nSpielPanNamInvisible extends TimerTask{
			public void run(){
			
			// Blende MenuPanel aus
			MenuAction.this.menu.nSpielPanNam.setVisible(false);
			
			// Aufruf der Spieloberflaeche
			((GameWindow)(MenuAction.this.menu.getParent().getParent().getParent().getParent())).loadComponents();
			}
		}
		
		//*************************************************************************
		//----Timer, schliesst nach 5 Sekunden das Fenster und ruft Spieloberflaeche auf----
		Timer timer = new Timer();
		timer.schedule(new nSpielPanNamInvisible(), 5000);
		//*************************************************************************
		
		
		}
		else // Tritt ein, wenn p<2
		{
			// Label "Zu wenig Spieler vorhanden" anzeigen
			this.menu.morePlayer.setVisible(true);
		}
		
		}
		
		// *************************************************
		// Aktion bei Klick auf Button "back"
		// *************************************************
		if( e.getSource().equals(this.menu.back))
		{
		// Elemente aus nSpielPanTxt und nSpielPanTxt entfernen
			this.menu.nSpielPanTxt.setVisible(false);	
			
			
			this.menu.name1txt.setVisible(false);
			this.menu.name2txt.setVisible(false);
			this.menu.name3txt.setVisible(false);
			this.menu.name4txt.setVisible(false);
			
			this.menu.lab_red.setVisible(false);
			this.menu.lab_blue.setVisible(false);
			this.menu.lab_yellow.setVisible(false);
			this.menu.lab_green.setVisible(false);
			
			this.menu.name1lab.setVisible(false);
			this.menu.name2lab.setVisible(false);
			this.menu.name3lab.setVisible(false);
			this.menu.name4lab.setVisible(false);
			
			this.menu.spielerBestaet.setVisible(false);	
			
			// Labels des Hauptmenus sichtbar machen
			this.menu.nSpiel.setVisible(true);
			this.menu.sSpiel.setVisible(true);
			this.menu.lSpiel.setVisible(true);
			this.menu.bSpiel.setVisible(true);
			
			this.menu.back.setVisible(false);
		}
		
	}
	
}	
